#pragma once
// #autor:yxj
#include "rclcpp/rclcpp.hpp"
#include <agv_peripheral_controller/roller/io_lift.h>

///////////////////////配置IO///////////////////////////
// 开关信号
// 左前阻挡-输入io
#define UP_LIMIT_FRONT_LEFT "upLimitFrontLeft"
#define DOWN_LIMIT_FRONT_LEFT "downLimitFrontLeft"
#define FAULT_FRONT_LEFT "faultFrontLeft"

// 左前阻挡-控制输出io
#define CONTROL_UP_FRONT_LEFT "upControlFrontLeft"
#define CONTROL_DOWN_FRONT_LEFT "downControlFrontLeft"
#define CLEAR_FAULT_FRONT_LEFT "clearFaultFrontLeft"
#define BRAKE_FRONT_LEFT "brakeFrontLeft" // 暂时不启用

// 右前阻挡-输入io
#define UP_LIMIT_FRONT_RIGHT "upLimitFrontRight"
#define DOWN_LIMIT_FRONT_RIGHT "downLimitFrontRight"
#define FAULT_FRONT_RIGHT "faultFrontRight"

// 右前阻挡-控制输出io
#define CONTROL_UP_FRONT_RIGHT "upControlFrontRight"
#define CONTROL_DOWN_FRONT_RIGHT "downControlFrontRight"
#define CLEAR_FAULT_FRONT_RIGHT "clearFaultFrontRight"
#define BRAKE_FRONT_RIGHT "brakeFrontRight" // 暂时不启用

// 阻挡上升-下降旋钮
#define SWITCH_UP_BARRIER "switchUpBarrier"
#define SWITCH_DOWN_BARRIER "switchDownBarrier"

///////////////////////阻挡举升机构控制组///////////////////////////////
namespace peripheral_roller
{

    // IO举升控制类
    class CBarrierControl
    {
    public:
        // 默认构造函数
        CBarrierControl();

        // 析构函数
        ~CBarrierControl();

        // 初始化函数
        bool init();

        // 举升上升
        bool up();

        // 举升下降
        bool down();

        // 举升停止
        bool stop();

        // 触发了错误
        bool fault();

        // 具体的报错信息
        std::string faultMsg();

        // 清除错误
        bool clearFault();

        // 货物装填
        bool loadStatus();
        
        //最高位
        bool upTarget();

        //最低位
        bool downTarget();

        // 手动旋钮状态
        SwitchState switchBtn();

    private:
        // 获取新IO输入信号回调函数
        void readInputNewCallBack(const agv_msgs::msg::ReadInPutsNew &msg);

        // 更新输入IO对象
        void updateInutIoNew(const agv_msgs::msg::ReadInPutsNew &msg, INPUT_IO_TYPE &inputIoObj);

        // 是否初始化完成
        bool initFinish();

        // 上层订阅事件
    private:
        // 上升旋钮信号触发
        INPUT_IO_TYPE m_upSwitch;

        // 下降旋钮信号触发
        INPUT_IO_TYPE m_downSwitch;

        // 前举升
        CIoLift m_frontLeftLift;

        // 后举升
        CIoLift m_frontRightLift;

        // 初始化完成标识
        bool m_init;

        // 私有节点句柄
        rclcpp::Node m_priNh;

        // 订阅新的IO输入信号话题
        ros::Subscriber m_subIoNew;

        // 控制IO输出客户端
        ros::ServiceClient m_outClient;
    };
}